package com.itheima.d3_udp2;

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Scanner;

/**
 * 目标：完成UDP通信快速入门：实现客户端反复的发。
 *
 * 客户端可以反复发送数据
 * 客户端实现步骤
 * 创建DatagramSocket对象（发送端对象）                      扔韭菜的人
 * 使用while死循环不断的接收用户的数据输入，如果用户输入的exit则退出程序
 * 如果用户输入的不是exit,  把数据封装成DatagramPacket                      韭菜盘子
 * 使用DatagramSocket对象的send方法将数据包对象进行发送                   开始抛出韭菜
 * 释放资源
 *
 * 接收端可以反复接收数据
 * 接收端实现步骤
 * 创建DatagramSocket对象并指定端口（接收端对象）                      接韭菜的人
 * 创建DatagramPacket对象接收数据（数据包对象）                    韭菜盘子
 * 使用DatagramSocket对象的receive方法传入DatagramPacket对象
 * 使用while死循环不断的进行第3步
 *
 *
 *UDP的接收端为什么可以接收很多发送端的消息？
 *   接收端只负责接收数据包，无所谓是哪个发送端的数据包。
 *
 */
public class Client {
    public static void main(String[] args) throws Exception {
        // 1、创建客户端对象（发韭菜出去的人）
        DatagramSocket socket = new DatagramSocket();   //这次案例没有指定客户端的端口号，所以在启动后会随机一个端口号

        // 2、创建数据包对象封装要发出去的数据（创建一个韭菜盘子）
       /* public DatagramPacket(byte buf[], int length,
             InetAddress address, int port)
               参数一：封装要发出去的数据。
               参数二：发送出去的数据大小（字节个数）
               参数三：服务端的IP地址（找到服务端主机）
               参数四：服务端程序的端口。
             */
        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请说：");
            String msg = sc.nextLine();     //输入一行数据

            // 一旦发现用户输入的exit命令，就退出客户端
            if("exit".equals(msg)){
                System.out.println("欢迎下次光临！退出成功！");
                socket.close(); // 释放资源
                break; // 跳出死循环
            }

            //把输入的数据转成字节数组的形式
            //public static InetAddress getLocalHost()   获取本机IP，会以一个inetAddress的对象返回
            byte[] bytes = msg.getBytes();
            DatagramPacket packet = new DatagramPacket(bytes, bytes.length
                    , InetAddress.getLocalHost(),  6666);

            // 3、开始正式发送这个数据包的数据出去了
            socket.send(packet);
        }
    }
}
